package es.ucm.fdi.pe.practica3.genetico3.mutacion;

import es.ucm.fdi.pe.practica3.genetico3.Arbol;
import es.ucm.fdi.pe.practica3.genetico3.Arbol.Tipo;
import es.ucm.fdi.pe.practica3.genetico3.Arbol.TipoHijo;
import es.ucm.fdi.pe.practica3.genetico3.Individuo;

public class MutacionInicializacion extends Mutacion {
	
	Arbol subarbol;
	
	MutacionInicializacion(){
		subarbol=new Arbol(0,0,null,TipoHijo.R);
	}
	
	
	public void mutar(Individuo i){
		
		int nodoAMutar=alea_entero(1,i.getArbol().getNum_nodos());
//		System.out.println("Nodo A mutar:"+nodoAMutar);
		
		mutar(nodoAMutar,i.getArbol());
	}
	
	public int mutar(int n, Arbol a){
		
		n--;
		if(n==0){
			
			if (a.getTipoHijo()!=null){
			
				switch(a.getTipoHijo()){
					case R:
						a.setTipo(subarbol.getTipo());
						
						if(subarbol.tieneHijoIzquierdo())
							a.setHI(new Arbol(subarbol.getHI()));
						
						if(subarbol.getTipo()==Tipo.PROGN2||subarbol.getTipo()==Tipo.SIC){
							a.setHC(null);
						}
						else{
							if(subarbol.tieneHijoCentral())
								a.setHC(new Arbol(subarbol.getHC()));
						}
						
						if(subarbol.tieneHijoDerecho())
							a.setHD(new Arbol(subarbol.getHD()));
						
						break;
					case C:
						a.getPadre().setHC( new Arbol(subarbol)); break;
					case D:
						a.getPadre().setHD( new Arbol(subarbol)); break;
					case I:
						a.getPadre().setHI( new Arbol(subarbol)); break;
				}
		
			}
		}else if(!a.soyTerminal()){
			n=mutar(n,a.getHI());
			if(n>0)
				if(a.getHC()==null){
					n=mutar(n,a.getHD());
				}else{
					n=mutar(n,a.getHC());
					if(n>0){
						n=mutar(n,a.getHD());
					}
				}
		}
		return n;
	}

}
